import axios, { InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { message } from 'antd'
import { BASE_URL, TIME_OUT } from './config'

// 创建axios实例
const hyRequest = axios.create({
  baseURL: BASE_URL,
  timeout: TIME_OUT,
  // 表示跨域请求时是否需要使用凭证
  withCredentials: true
})
// 请求拦截器
hyRequest.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 301错误基本都是没登录就调用了需要登录的接口
    // 如果登录后还提示301，就加上时间戳或者等待2分钟或者重启服务重新登录再调用此接口
    config.params = {
      ...config.params,
      timestamp: Date.now()
    }
    return config
  },
  (error: any) => {
    return Promise.reject(error)
  }
)
// 响应拦截器
hyRequest.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response
    // 200表示请求成功
    if (data.code == 200) {
      return response.data
    }
    // 301错误基本都是没登录就调用了登录接口
    if (data.code == 301) {
      message.error('未登录，如已登录请清空缓存后重试!')
      return Promise.reject(new Error('发生301错误'))
    }
    // 部分接口如登录接口不能调用太频繁，否则可能会报503错误或者ip高频错误
    if (data.code == 503) {
      message.error('接口调用过于频繁')
      return Promise.reject(new Error('发生503错误'))
    }
    if (data.code == 406) {
      // message.error('由于网易限制,此项目在国外服务器或部分国内云服务上使用会受到限制')
      return Promise.reject(new Error('406cheating异常'))
    }
    return Promise.resolve(response)
  },
  (error: any) => {
    return Promise.reject(error.response || error.message)
  }
)

export default hyRequest
